/**
 * @file Map.h
 * @brief 地图加载和管理类
 * @details 负责加载BMP地图、坐标转换、碰撞检测等地图相关操作
 */

#ifndef MAP_H
#define MAP_H

#include "Types.h"
#include <vector>
#include <string>
#include <memory>

namespace PathPlanning
{
class Map
{
public:
    Map();
    virtual ~Map();

    /**
     * @brief 从BMP文件加载地图
     * @param filename BMP文件路径
     * @return 加载是否成功
     */
    bool loadFromBMP(const std::string& filename);

    /**
     * @brief 获取地图宽度 (像素)
     */
    int getWidth() const
    {
        return width_;
    }

    /**
     * @brief 获取地图高度 (像素)
     */
    int getHeight() const
    {
        return height_;
    }

    /**
     * @brief 获取地图分辨率 (米/像素)
     */
    double getResolution() const
    {
        return resolution_;
    }

    /**
     * @brief 设置地图分辨率
     */
    void setResolution(double resolution)
    {
        resolution_ = resolution;
    }

    /**
     * @brief 检查网格坐标是否为障碍物
     * @param x 网格x坐标
     * @param y 网格y坐标
     * @return 是否为障碍物
     */
    bool isObstacle(int x, int y) const;

    /**
     * @brief 检查世界坐标是否为障碍物
     * @param worldX 世界x坐标
     * @param worldY 世界y坐标
     * @return 是否为障碍物
     */
    bool isObstacle(double worldX, double worldY) const;

    /**
     * @brief 检查世界坐标点是否为障碍物
     */
    bool isObstacle(const Point& point) const;

    /**
     * @brief 世界坐标转网格坐标
     */
    GridCell worldToGrid(double worldX, double worldY) const;

    /**
     * @brief 世界坐标点转网格坐标
     */
    GridCell worldToGrid(const Point& point) const;

    /**
     * @brief 网格坐标转世界坐标
     */
    Point gridToWorld(int gridX, int gridY) const;

    /**
     * @brief 网格坐标转世界坐标
     */
    Point gridToWorld(const GridCell& cell) const;

    /**
     * @brief 检查坐标是否在地图范围内
     */
    bool isInBounds(int gridX, int gridY) const;
    bool isInBounds(double worldX, double worldY) const;
    bool isInBounds(const Point& point) const;

    /**
     * @brief 获取地图数据 (用于可视化)
     */
    const std::vector<uint8_t>& getMapData() const
    {
        return mapData_;
    }

    /**
     * @brief 显示地图信息
     */
    void printInfo() const;

private:
    std::vector<uint8_t> mapData_; // 地图数据 (0-255, 0=自由, 255=障碍)
    int                  width_      = 0;
    int                  height_     = 0;
    double               resolution_ = 0.1; // 米/像素

    /**
     * @brief 读取BMP文件头信息
     */
    bool readBMPHeader(const std::string& filename, int& width, int& height);
};

} // namespace PathPlanning

#endif